#include "Serveur.h"

void Serveur::demarrer(const char* port)
{

  nouveauMessage=0;

  lg = sizeof(adresse);

  /* creation et attachement de la socket */
  lePort = atoi(port);



  socket_ecoute=r.creer_socket();

  /* Preparation de l'adresse d'attachement = adresse IP Internet */
  adresse.sin_family=AF_INET;

  /* Indication de l'adresse IP locale de la socket */
  /* Conversion (representation interne) -> (reseau) avec htonl et htons */
  adresse.sin_addr.s_addr=htonl(INADDR_ANY); /* toutes les interfaces présentes */

  /* Indication du port local de la socket */
  /* si lePort = 0, l'adresse sera choisie au hasard par le système au dessus de 1024 */
  adresse.sin_port=htons(lePort);

  /* Demande d'attachement de la socket */
  if (bind(socket_ecoute,(struct sockaddr*)&adresse,lg) == -1)
    {
      perror("Attachement de la socket impossible");
      close(socket_ecoute);
      exit(2);
    }
  printf ("Reseau :Le socket %d est maintenant en attente sur le port %u\n", socket_ecoute, lePort);


}
void Serveur::eteindre(void)
{
  close(socket_ecoute);
}
Message Serveur::connexion(){

  size_t taille=sizeof(Message);

  /* Pour récupérer les informations d'attachement local on
   * peut utiliser la fonction getsockname(2)
   *
   *   struct sockaddr_in adresse;
   *   getsockname(socket_ecoute,(struct sockaddr*)&adresse,&lg);
   */


  printf ("Serveur :Le socket %d est maintenant ouverte en mode TCP/IP\n", socket_ecoute);

  /* declaration de l'ouverture du service */
  if (listen(socket_ecoute, 10) == -1) {
    perror("Listen");
    exit(3);
  }
  /* prise en charge d'une connexion        */
  /* on accepte ici qu'une seule connexion à la fois */
  socket_service=accept(socket_ecoute,(struct sockaddr*) &adresse, &lg);
  if (socket_service == -1) {
    perror("Accept");
    exit(4);
  }
  printf("Serveur :Connection de %s sur le port %d\n", inet_ntoa (adresse.sin_addr), htons(adresse.sin_port));


  /* la connexion est acceptee, on lit tout */
  /*int Taille = sizeof(Message);*/
  Message buff;
  size_t nbo;
  nbo = recv(socket_service,(void*)&buff,taille,0);
  if (nbo < 0) {
    perror("erreur à la réception");
  }
  if (nbo == taille) {
    // C'est fini
    printf("reception  de %d données\n",nbo);
  }
  printf("MESSAGE RECU\n");
  nouveauMessage=1;
  printf("je modifie nouveauMessage\n");
  // messageAfficher(&buff);

  /* femeture de la socket créée par le accept(), la socket
   * socket_ecoute reste active */
  close(socket_service);

  return buff;
}

int Serveur::getnouveauMessage() {

  return nouveauMessage;
}
